<!DOCTYPE html>
<html lang="en">
	<head>
		<meta charset="UTF-8" />
		<meta http-equiv="X-UA-Compatible" content="IE=edge" />
		<meta name="viewport" content="width=device-width, initial-scale=1.0" />
		<title>Document</title>
	</head>
	<body>
		<script>
			// 1. JS是一门单线程的语言
			// 也就是同一时间只能做一件事情，所有的工作都依次执行。

			// Q: 为什么js是单线程的语言呢？
			// JS设计之初，为了做dom的交互来设计，如果同一时间又可以添加一个元素节点，又要删除一个元素节点
			// 这个时候，计算机不知道该执行哪个命令了，所以，JS是单线程的语言。

			// 进程是资源分配的最小单位，线程是cpu调度的最小单位。 太抽象，不好理解
			// 进程（process）: 一个进程就是一个正在运行的程序（任务管理器）
			// 线程（thread）:  一个进程内执行着的每个任务就是线程。
			// ==> 线程是允许应用程序并发执行任务的一种机制
			// 进程包含了线程

			// 想象 进程 就是运行着的工厂， 工厂里面的每一条流水线 就是线程

			// 进程 ==> 火车    线程 ==> 每一节车厢
			// 1. 线程必须依附于进程存在   车厢组成火车
			// 2. 一个进程里面可以包含多个线程。 一个火车由多个车厢组成

			// 3.同步和异步
			// 同步： 同一时间只能执行一个任务
			// 异步： 可以同时执行多个任务，提高程序性能

			// 同步任务
			// 同步任务都在主线程上执行，形成一个执行栈。

			// 异步任务
			// JS的异步任务是通过回调函数来实现的。在做这个任务的同时，我们还可以处理其他任务
			// 常见的三种类型
			// 1. 事件：click resize scroll
			// 2. 资源加载：load DOMContentLoaded
			// 3. 定时器： setTimeout / setInterval

			console.log(1)
			console.log(2)
			setTimeout(function () {
				console.log(3)
			}, 0)
			setTimeout(function () {
				console.log(5)
			}, 1000)
			console.log(4)

			// 以下 需要掌握 背下来！！！
			// js的执行机制
			// 1. 首先判断JS任务是同步还是异步的，同步任务会在主线程的执行栈中依次循序执行
			// 2. 异步任务会提交给对应的异步进程处理，比如setTimeout，click等事件，当满足触发条件的时候，
			// 异步进程会把异步任务（回调函数）放到任务队列中
			// 3. 当主线程的所有同步任务执行完毕后，会去任务队列中查看是否有可以执行的异步任务，如果有，拿到主线程中执行
			// 依次循环
			// 异步进程 ===> 处理什么时候将异步任务放到任务队列中
		</script>
	</body>
</html>
